# Лекция: Интерфейсы в Java

В Java интерфейсы используются для определения контракта или поведения, которое классы могут реализовывать. Интерфейс может содержать методы и переменные, но методы по умолчанию являются абстрактными (т.е. без тела).

## Ключевое слово interface

Интерфейс объявляется с помощью ключевого слова `interface`.

```java
interface MyInterface {
    // код интерфейса
}
```

## Реализация интерфейсов

Классы могут реализовывать интерфейсы с помощью ключевого слова `implements`.

```java
class MyClass implements MyInterface {
    // реализация методов интерфейса
}
```

## Множественная реализация

В Java класс может реализовывать несколько интерфейсов.

```java
class MyClass implements Interface1, Interface2 {
    // реализация методов интерфейсов
}
```

---

# Практические задания

1. **Создайте интерфейс `SoundMaker` с методом `makeSound`.** (Сложность: 1/5)
```java
interface SoundMaker {
    void makeSound();
}
```

2. **Создайте класс `Dog`, который реализует интерфейс `SoundMaker`.** (Сложность: 2/5)
```java
class Dog implements SoundMaker {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}
```

3. **Создайте интерфейс `Shape` с методами `getArea` и `getPerimeter`.** (Сложность: 2/5)
```java
interface Shape {
    double getArea();
    double getPerimeter();
}
```

4. **Создайте класс `Rectangle`, который реализует интерфейс `Shape`.** (Сложность: 3/5)
```java
class Rectangle implements Shape {
    double width;
    double height;

    @Override
    public double getArea() {
        return width * height;
    }

    @Override
    public double getPerimeter() {
        return 2 * (width + height);
    }
}
```

5. **Создайте класс `Circle`, который реализует интерфейс `Shape`.** (Сложность: 3/5)
```java
class Circle implements Shape {
    double radius;

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public double getPerimeter() {
        return 2 * Math.PI * radius;
    }
}
```